package main;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import tabs.ElementsTab;
import tabs.MainTab;
import tabs.MenuTab;
import classes.Page;
import controller.EditorInterfaceController;

public class EditorInterface extends EditorInterfaceController
{

	private JFrame frame;
		
	/**
	 *	Elementos do menu principal.
	 */
	private JMenuItem newFile = new JMenuItem( "Novo" );
	private JMenuItem openFile = new JMenuItem( "Abrir" );
	private JMenuItem saveFile = new JMenuItem( "Salvar" );
	private JFileChooser fc = new JFileChooser();

   /**
    * Painéis das abas.
    */
	private JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
	private MainTab panelConfig;
	private ElementsTab panelElements;
	private MenuTab panelMenu;
	//private JPanel panelCreditos = new JPanel();
	
	/**
    * Launch the application.
    */
   public static void main( String[] args )
   {
      EventQueue.invokeLater( new Runnable() {
         public void run()
         {
            try
            {
               EditorInterface window = new EditorInterface();
               window.frame.setVisible( true );
            }
            catch ( Exception e )
            {
               e.printStackTrace();
            }
         }
      } );
   }

	/**
    * Create the application.
    */
	public EditorInterface()
	{
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize()
	{
		frame = new JFrame();
		frame.setTitle( "LOMaker - EditorWeb" );
		frame.setBounds( 100, 100, 720, 470 );
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.getContentPane().setLayout( null );
		frame.setResizable( false );
	
		initializeMenu();
		initializeTabs();
	}
	
	/**
	 *	Inicializa o menu principal do programa.
	 */
	private void initializeMenu()
	{
		JMenuBar menuBar = new JMenuBar();
		frame.setJMenuBar(menuBar);
		
		JMenu mnArquivo = new JMenu("Arquivo");
		menuBar.add(mnArquivo);
		
		// Configura o botão de criar novo objeto.
		newFile.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent arg0)
			{
				newFileAction();
			}
		});
		mnArquivo.add(newFile);
		
		// Configura o botão de abrir arquivo.
		openFile.addActionListener( new ActionListener(){
			public void actionPerformed(ActionEvent arg0)
			{
				//openFileAction();
				openFileDebugAction();
			}
		});
		mnArquivo.add(openFile);

		// Configura o botão de salvar arquivo.
		saveFile.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0)
			{
				saveFileAction();
			}
		} );
		mnArquivo.add(saveFile);
		
		// Configura o botão de fechar o aplicativo.
		JMenuItem mnFechar = new JMenuItem("Fechar");
		mnFechar.addActionListener( new ActionListener(){
			public void actionPerformed(ActionEvent arg0)
			{
				System.exit(0);
			}
		});
		mnArquivo.add(mnFechar);
	}

	/**
	 *	Inicializa as abas. 
	 */
	private void initializeTabs()
	{
		tabbedPane.setBounds( 0, -1, 708, 416 );
		frame.getContentPane().add( tabbedPane );
		
		// Adiciona listener para carregar os elementos da aba somente quando a
		// mesma for selecionada.
		ChangeListener changeListener = new ChangeListener() {
			public void stateChanged( ChangeEvent changeEvent )
			{
				JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent.getSource();
				int index = sourceTabbedPane.getSelectedIndex();
				if ( index == 0 )
				{
					System.out.println( "Trocou para a aba geral" );
					panelConfig.loadTab();
				}
				else if ( index == 1 )
				{
					System.out.println( "Trocou para a aba de menu" );
					panelMenu.loadTab();
				}
				else if ( index == 2 )
				{
					System.out.println( "Trocou para a aba de conteúdo" );
				}
				else if ( index == 3 )
				{
					System.out.println( "Trocou para a aba de créditos" );
				}
			}
		};
      	tabbedPane.addChangeListener( changeListener );

		initializeConfigTab();
		initializeMenuTab();
		initializeContentsTab();
      // initializeCreditsTab();
	}
	
	/**
	 *	Inicializa aba de configurações gerais do objeto. 
	 */
	private void initializeConfigTab()
	{
		panelConfig = new MainTab( this );
		tabbedPane.addTab( "Configurações Gerais", null, panelConfig, null );
	}
	
	/**
	 *	Inicializa a aba de edição das páginas. 
	 */
	private void initializeContentsTab()
	{
		panelElements = new ElementsTab();
		tabbedPane.addTab( "Elementos", null, panelElements, null) ;
	}

   /**
    * Inicializa a aba de edição do menu do objeto.
    */
	private void initializeMenuTab()
	{
		panelMenu = new MenuTab( this );
		tabbedPane.addTab("Menu", null, panelMenu, null);
	}
	
	/**
	 *	Inicializa a aba de edi��o dos cr�ditos. 

	private void initializeCreditsTab()
	{
		tabbedPane.addTab("Cr�ditos", null, panelCreditos, null);
		panelCreditos.setLayout(null);
		
		JPanel panel_Creditos = new JPanel();
		panel_Creditos.setBorder(new LineBorder(new Color(0, 0, 0)));
		panel_Creditos.setBounds(20, 21, 376, 231);
		panelCreditos.add(panel_Creditos);
		panel_Creditos.setLayout(null);
		
		JScrollPane scrollPaneCreditos = new JScrollPane();
		scrollPaneCreditos.setBounds(10, 8, 227, 185);
		panel_Creditos.add(scrollPaneCreditos);
		
		table = new JTable();
		scrollPaneCreditos.setViewportView(table);
		table.setBorder(new LineBorder(new Color(0, 0, 0)));
			table.setModel(new DefaultTableModel(
			new Object[][] {
				{null, null, null, null},
				{null, null, null, null},
				{null, null, null, null},
				{null, null, null, null},
				{null, null, null, null},
				{null, null, null, null},
				{null, null, null, null},
				{null, null, null, null},
				{null, null, null, null},
				{null, null, null, null},
			},
			new String[] {
				"Nome", "Fun\u00E7\u00E3o", "T\u00EDtulo", "Entidade"
			}
		)); 
		
	
		
		JButton btnAdicionaCredito = new JButton("Adicionar\r\n");
		btnAdicionaCredito.setBounds(264, 11, 89, 23);
		panel_Creditos.add(btnAdicionaCredito);
		
		JButton btnRemoveCredito = new JButton("Remover");
		btnRemoveCredito.setBounds(264, 45, 89, 23);
		panel_Creditos.add(btnRemoveCredito);
		
	}*/

	/**
	 * Executa a ação do botão de criar novo arquivo. 
	 */
	private void newFileAction()
	{
		//TODO: perguntar se deve salvar o aqruivo corrente.
		
		fileName = "";
		
		// Limpa a estrutura do xml.
		clearObject();
		
		// Limpa as propriedades do editor.
		panelConfig.clearProp();
		panelElements.clearProp();
		panelMenu.clearProp();
	}
	/**
	 * Executa a ação do botão de abrir. 
	 */
	private void openFileAction()
	{		
		int returnVal = fc.showOpenDialog(fc);
        if( returnVal == JFileChooser.APPROVE_OPTION )
        {
        	File file = fc.getSelectedFile();
            //This is where a real application would open the file.
        	String name = file.getAbsolutePath();
            openFile( name );
            fileName = name;
            loadFields();
            System.out.println( "Abrindo arquivo " + file.getAbsolutePath());              
        } 
        else
        	System.out.println( "Erro" ) ;
	}
	
	/**
	 *  Abre arquivo sem necessidade de escolher. Utilizado para debug.
	 */
	@SuppressWarnings("unused")
	private void openFileDebugAction()
	{
		fileName = "../exemplo.xml";
		openFile( fileName );
		loadFields();
	}
	
	/**
	 * Executa a ação do botão de salvar. 
	 */
	private void saveFileAction()
	{
		if( fileName.isEmpty() )
		{
			int returnVal = fc.showSaveDialog(fc);
			if( returnVal == JFileChooser.APPROVE_OPTION ) 
			{
	            File file = fc.getSelectedFile();
	            fileName = file.getAbsolutePath();		                
			} 
			else
			{
				System.out.println( "Mandou cancelar." ) ;
				return; //Garante que não vai tentar salvar.
			}
		}

		saveFile();
		JOptionPane.showMessageDialog( null, "Arquivo salvo com sucesso", "Aviso", 1);
		System.out.println( "Salvando arquivo " + fileName );
	}

   /**
    * Atualiza o valor dos formulários com os dados do objeto que foi aberto.
    * Vai para a aba de configurações gerais.
    */
	private void loadFields()
	{
		tabbedPane.setSelectedIndex( 0 );
		panelConfig.loadTab(); //Carrega informações gerais.
	}
	
	/**
	 * Vai para a aba de edição de elementos com o conteúdo da página passada como parâmetro.
	 * 
	 * @param idOfPage Identificador da página que se deseja editar o conteúdo.
	 */
	public void showElements( String idOfPage )
	{
		Page page = getPage( idOfPage );
		panelElements.loadElementsOfPage( page );
		tabbedPane.setSelectedIndex( 2 );
	}

}
